package com.itany.corejava.code08_常用类.包装类;

/**
 * @author 石小俊
 * @date 2023年04月27日 11:34
 */
public class Test01_定义方式 {

    public static void main(String[] args) {
        // 定义方式一:通过构造方法来定义
        byte b = 1;
        Byte b1 = new Byte(b);
        Byte b2 = new Byte("1");
        // 定义方式二:通过valueOf方法进行定义
        Byte b3 = Byte.valueOf(b);
        Byte b4 = Byte.valueOf("1");

        // 定义的时候,由于都可以传递字符串,如果存在传递的字符串的值无法转换成对应类型
        // 会抛出NumberFormatException
        // byte b5 = new Byte("aaa");

        // 当传递的字符串格式没有问题,但是值超出范围的时候
        // 此时不会强制转换成对应格式的数据,而是抛出NumberFormatException
        // Byte b5 = new Byte("1000"); // 报错
        // Short、Integer、Long用法与Byte一致

        // 对于Boolean类型,传递的字符串值为true时其值返回true
        // 传递的字符串值是true以外的任意值时都返回false
        Boolean flag2 = new Boolean("admin"); // false
        System.out.println(flag2);

        // 对于Float类型,其构造方法支持float与double
        Float f = new Float(3.14F);
        Float f2 = new Float(3.14);
        System.out.println(f);

        // 虽然Double的构造方法参数没有float
        // 但是float在运算时会自动转换成对应的double
        Double d = new Double(3.14F);
        System.out.println(d);

        // 对于Character类型,其构造方法的参数只能是char,不能是String
        Character c = new Character('A');

        Integer i1 = Integer.valueOf(100);
        Integer i2 = Integer.valueOf("100");
        System.out.println(i1 == i2);   // true

        Integer i3 = Integer.valueOf(1000);
        Integer i4 = Integer.valueOf("1000");
        System.out.println(i3 == i4);   // false
        // 为什么第一个为true,第二个为false?
        // 查看valueOf方法源代码,展示如下
        // if (i >= IntegerCache.low && i <= IntegerCache.high)
        //     return IntegerCache.cache[i + (-IntegerCache.low)];
        // return new Integer(i);
        // 当i的值在low与high之间,通过源码可以发现即为:[-128,127]
        // 此时并没有创建新的对象,而是从缓存中取出来的
        // 只有超出范围,才会创建新的对象

        // 包装类具有面向对象的特征,可以调用Object方法
        System.out.println(i3.getClass());
        System.out.println(i3.hashCode());
    }

}
